package model.action.basic_function_action;


import java.io.File;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import model.dap.dao.ConsumerDAO;
import model.dap.domain.Consumer;
import model.dap.mapper.ConsumerMapper;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ModelDriven;
import common.base.BaseAction;
import common.util.ValidateUtil;

@Results({
		@Result(name = "ViewDetailAccountLoad", type = "tiles", location = "tiles.Account"),
		@Result(name = "error", type = "tiles", location = "tiles.Account"),
		@Result(name = "success", type = "tiles", location = "tiles.Account"),
		@Result(name = "successEx", type = "redirectAction", location = "getConsumerbyId2.html"),
})
@ParentPackage("master_login")
public class AccountProfileAction extends BaseAction implements ModelDriven<Consumer> {

	private static final long serialVersionUID = 1L;
	protected static Logger log = Logger.getLogger(AccountProfileAction.class);
	private Consumer consumer = new Consumer();
	private String citySelected, districtSelected, genderSelected, birthDay, avatarUrl1;
	private String contextPath = null;
	private String userID;
	private String imgAURL;
	private File myfile;
	private String myfileFileName, myfileContentType;
	
	
	public String getContextPath() {
		return contextPath;
	}

	public void setContextPath(String contextPath) {
		this.contextPath = contextPath;
	}

	public String getAvatarUrl1() {
		return avatarUrl1;
	}

	public void setAvatarUrl1(String avatarUrl1) {
		this.avatarUrl1 = avatarUrl1;
	}

	public String getBirthDay() {
		return birthDay;
	}

	public void setBirthDay(String birthDay) {
		this.birthDay = birthDay;
	}

	public String getCitySelected() {
		return citySelected;
	}

	public void setCitySelected(String citySelected) {
		this.citySelected = citySelected;
	}

	public String getDistrictSelected() {
		return districtSelected;
	}

	public void setDistrictSelected(String districtSelected) {
		this.districtSelected = districtSelected;
	}

	public String getGenderSelected() {
		return genderSelected;
	}

	public void setGenderSelected(String genderSelected) {
		this.genderSelected = genderSelected;
	}

	public Consumer getConsumer() {
		return consumer;
	}

	public void setConsumer(Consumer consumer) {
		this.consumer = consumer;
	}

	public String getImgAURL() {
		return imgAURL;
	}

	public void setImgAURL(String imgAURL) {
		this.imgAURL = imgAURL;
	}

	public String getUserID() {
		userID = ServletActionContext.getRequest().getParameter("userID");
		return userID;
	}

	public void setUserID(String userID) {
		this.userID = userID;
	}

	/** Set the locale language */
	public AccountProfileAction() {

	}

	public File getMyfile() {
		return myfile;
	}
	public void setMyfile(File myfile) {
		this.myfile = myfile;
	}
	public String getMyfileFileName() {
		return myfileFileName;
	}
	public void setMyfileFileName(String myfileFileName) {
		this.myfileFileName = myfileFileName;
	}
	public String getMyfileContentType() {
		return myfileContentType;
	}
	public void setMyfileContentType(String myfileContentType) {
		this.myfileContentType = myfileContentType;
	}
	// ======================================================================================================
	public static String convertDateToString(Date date, String format) {
	    SimpleDateFormat mySimpleDateFormat = new SimpleDateFormat(format);
	    return mySimpleDateFormat.format(date);
	}
	 
	public static Date convertStringToDate(String dateStr, String format) {
	    SimpleDateFormat mySimpleDateFormat = new SimpleDateFormat(format);
	    try {
	        return mySimpleDateFormat.parse(dateStr);
	    } catch (ParseException e) {
	        return null;
	    }
	}
	// ======================================================================================================

	// GET CONSUMER BY ID2
	@Action("/master/getConsumerbyId2")
	public String getConsumerbyId2() {
		try {
			
			getCityList2();
			loadParentDealCategory();
			consumer.setUserID(getCurrentUser().getUserID());
			ConsumerMapper consumermapper = new ConsumerDAO();
			consumer = consumermapper.getConsumerbyId2(getCurrentUser().getUserID());
			// lay ra danh sach quan, huyen theo consumer
			getCityList();
			getDistrictList(consumer.getCityID());
			createGenderList();
			
			// lay ra thanh pho, quan huyen da chon de hien thi len giao dien...
			citySelected = String.valueOf(consumer.getCityID());
			districtSelected = String.valueOf(consumer.getDistrictID());
			genderSelected = consumer.getGender();
			
			
			Consumer consumerResult = consumermapper.getConsumerbyId(getCurrentUser().getUserID());
			if(consumerResult == null){
				showError("Lỗi trong quá trình hiện thị thông tài khoản. Vui lòng thử lại");
				return ERROR;
			}
			HttpServletRequest request = ServletActionContext.getRequest();
			imgAURL = consumerResult.getAvatarUrl();
			contextPath = request.getContextPath();
			
			// convert date to string
			try{
				if(consumer.getBirthday()==null){
					birthDay = null;
				}
				else{
					birthDay = convertDateToString(consumer.getBirthday(), "dd/MM/yyyy");
					}
			}
			catch (Exception e){
				log.error(e.getMessage());
				showError("Lỗi trong quá trình hiển thị ngày sinh. ");
				return ERROR;
			}
			return SUCCESS;
		} catch (Exception e) {
			log.error(e.getMessage());
			showError("Lỗi xảy ra trong quá trình hiển thị tài khoản. Vui lòng thử lại");
			return ERROR;
		}
	}
	
	// ======================================================================================================
	// UPDATE CONSUMER PROFILE
	@Action("/master/update-consumer")
	public String updateConsumer() {

		try {
			String type = ServletActionContext.getRequest().getMethod();
			
			if(type.toUpperCase() == "GET")
			{
				return "successEx";
			}
			getCityList2();
			loadParentDealCategory();
			// ======================================================================================================
			consumer.setUserID(getCurrentUser().getUserID());
			getCityList();
			getDistrictList(Integer.parseInt(getCitySelected()));
			createGenderList();
			ConsumerMapper consumerMapper = new ConsumerDAO();
			Consumer cosumerResult = consumerMapper.getConsumerbyId(getCurrentUser().getUserID());

			if (myfile != null) {
				uploadFileToMyFolder();
			} else {
				consumer.setAvatarUrl(cosumerResult.getAvatarUrl());
			}
			// UPDATE CONSUMER WHEN CONSUMER'S BIRTHDAY != NULL || != ""
			if (ValidateUtil.validateEmptyString(getBirthDay()) == false) {
				// PARSE STRING TO DATE
				try {
					SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy");
					Date date = dateFormatter.parse(getBirthDay());
					consumer.setBirthday(date);
				} catch (Exception ex) {
					showError("Lỗi trong quá trình chuyển định dạng ngày sinh. Vui lòng thử lại");
					return ERROR;
				}
				if (ValidateUtil.validateDateFormat(birthDay) == false) {
					showError("Ngày sinh không hợp lệ");
					return ERROR;
				}
			}
			// ======================================================================================================
			// UPDATE CONSUMER WHEN CONSUMER'S BIRTHDAY = NULL || = ""
			else {
				try {
					consumer.setBirthday(null);
				} catch (Exception ex) {
					log.error(ex.getMessage());
					showError("Lỗi trong quá trình kiểm tra ngày sinh. Vui lòng thử lại");
					return ERROR;
				}
			}

			if (validateInputField() == false) {
				return ERROR;
			}

			consumer.setCityID(Integer.parseInt(getCitySelected()));
			consumer.setDistrictID(Integer.parseInt(getDistrictSelected()));
			consumer.setGender(getGenderSelected());

			int cons = consumerMapper.updateConsumer(consumer);
			Consumer consumerResult = consumerMapper.getConsumerbyId2(consumer
					.getUserID());
			if (cons == 0) {
				showError("Lỗi xảy ra trong quá trình cập nhật tài khoản. Vui lòng thử lại");
				return ERROR;
			}
			// =======================================================================================
			if (consumerResult == null) {
				showError("Lỗi trong quá trình hiển thị lại thông tin tài khoản. Vui lòng đăng xuất và thử lại");
				return ERROR;
			}
			// Refresh session
			delCurrentUser();
			consumer.setUserID(consumerResult.getUserID());
			
			consumer.setFullName(consumerResult.getFullName());
			setCurrentUser(consumerResult);
			//======================= TAI LAI TRANG ACCOUNT
			try {
				consumer.setUserID(getCurrentUser().getUserID());
				ConsumerMapper consumermapper = new ConsumerDAO();
				consumer = consumermapper.getConsumerbyId2(getCurrentUser().getUserID());
				// lay ra danh sach quan, huyen theo consumer
				getCityList();
				getCityList2();
				getDistrictList(consumer.getCityID());
				createGenderList();
				
				// lay ra thanh pho, quan huyen da chon de hien thi len giao dien...
				citySelected = String.valueOf(consumer.getCityID());
				districtSelected = String.valueOf(consumer.getDistrictID());
				genderSelected = consumer.getGender();
				
				
				Consumer consumerResult1 = consumermapper.getConsumerbyId(getCurrentUser().getUserID());
				if(consumerResult1 == null){
					showError("Lỗi trong quá trình hiện thị thông tài khoản. Vui lòng thử lại");
					return ERROR;
				}
				HttpServletRequest request = ServletActionContext.getRequest();
				imgAURL = consumerResult1.getAvatarUrl();
				contextPath = request.getContextPath();
				
				// convert date to string
				try{
					if(consumer.getBirthday()==null){
						birthDay = null;
					}
					else{
						birthDay = convertDateToString(consumer.getBirthday(), "dd/MM/yyyy");
						}
				}
				catch (Exception e){
					showError("Lỗi trong quá trình hiển thị ngày sinh. ");
					return ERROR;
				}
				setSuccessmessage("Cập nhật tài khoản thành công");
				return SUCCESS;
			} catch (Exception e) {
				log.error(e.getMessage());
				showError("Lỗi xảy ra trong quá trình hiển thị tài khoản. Vui lòng thử lại");
				return ERROR;
			}
		} catch (Exception e) {
			// TODO: handle exception
			log.error(e.getMessage());
			showError("Lỗi xảy ra trong quá trình cập nhật tài khoản. Vui lòng thử lại");
			return ERROR;
		}
	}
	// =============================================================== Change city
	@Action("/master/change-city2")
	public String change_city2() {
		getCityList2();
		loadParentDealCategory();
		String type = ServletActionContext.getRequest().getMethod();
		
		if(type.toUpperCase() == "GET")
		{
			return "successEx";
		}
		ConsumerMapper consumerMapper = new ConsumerDAO();
		Consumer cosumerResult = consumerMapper.getConsumerbyId(getCurrentUser().getUserID());
		if (myfile == null) {
			consumer.setAvatarUrl(cosumerResult.getAvatarUrl());
			uploadFileToMyFolder();
		} else {
			uploadFileToMyFolder();
		}
		try {
			getCityList();
			getCityList2();
			getDistrictList(Integer.parseInt(getCitySelected()));
			createGenderList();
			return SUCCESS;
			
		} catch (Exception e) {
			log.error(e.getMessage());
			showError("Lỗi xảy ra trong quá trình tải quận/huyện. Vui lòng thử lại");
			return ERROR;
		}
	}
	
	//=============================================================  Upload Image
	public String uploadFileToMyFolder() {
		try {
			ServletContext servletContext = ServletActionContext.getServletContext();
			String path = "/view/common_view/images/AccountImages";
			// getting the path to where the images will be uploaded
			String filePath = servletContext.getRealPath(path);

			File uploadDir = new File(filePath);
			// if the folder does not exits, creating it
			if (uploadDir.exists() == false) {
				uploadDir.mkdirs();
			}
			consumer.setAvatarUrl(path + "/" + getCurrentUser().getUserID() + fileExtention());//===============================================
			FileUtils.copyFile(myfile, new File(uploadDir, getCurrentUser().getUserID() + fileExtention()));

		} catch (Exception e) {
			System.out.println("Exception : " + e.getMessage());
			addActionError(e.getMessage());
			log.error(e.getMessage());
			showError("Lỗi xảy ra khi upload hình ảnh. Vui lòng thử lại");
			return ERROR;
		}
		return SUCCESS;
	}

	//============================================================= Format file
	// Format file
		public String fileExtention() {
		try {
			if (myfileContentType.equalsIgnoreCase("image/png")) {
				return ".png";
			}
			if (myfileContentType.equalsIgnoreCase("image/jpeg")) {
				return ".jpeg";
			}
			if (myfileContentType.equalsIgnoreCase("image/jpg")) {
				return ".jpg";
			}
			return SUCCESS;
		} catch (Exception e) {
			log.error(e.getMessage());
			showError("Vui lòng chọn file ảnh theo 1 trong các định dạng sau: .png, .jpg, .jpeg");
			return ERROR;
		}
		}
	
	//============================================================= VALIDATE INPUT FIELD
	public boolean validateInputField() throws UnsupportedEncodingException {
		boolean check = true;
		// =====================================================Validate EMPTY
		if (ValidateUtil.validateEmptyString(consumer.getFullName()) == true) {
			showError("Họ tên không được để trống");
			check = false;
		}
		
		if (ValidateUtil.validateEmptyString(consumer.getAddress()) == true) {
			showError("Địa chỉ không được để trống");
			check = false;
		}
		
		if (ValidateUtil.validateEmptyString(consumer.getPhoneNumber()) == true) {
			showError("Số điện thoại không được để trống");
			check = false;
		}
		// =====================================================Validate LENGTH

		if (ValidateUtil.validateLengthOfFullname(consumer.getFullName()) == false) {
			showError("Chiều dài Họ tên phải từ 6 đến 50 kí tự");
			check = false;
		}

		if (ValidateUtil.validateLengthOfAddress(consumer.getAddress()) == false) {
			showError("Chiều dài địa chỉ phải từ 10 đến 100 kí tự");
			check = false;
		}

		if (ValidateUtil.validateLengthOfPhoneNumber(consumer.getPhoneNumber()) == false) {
			showError("Chiều dài số điện thoại phải từ 10 đến 20 kí tự");
			check = false;
		}
		// =====================================================Validate not
		// choose city/district
		if (Integer.parseInt(getCitySelected()) == 0) {
			showError("Thành phố không được để trống.");
			check = false;
		}

		if (Integer.parseInt(getDistrictSelected()) == 0) {
			showError("Quận/huyện không được để trống.");
			check = false;
		}

		if (getGenderSelected() == "undefined") {
			showError("Giới tính không được để trống");
			check = false;
		}
		return check;
	}
	
	// ======================================================================================================
	// GET MODEL FOR CONSUMER
	@Override
	public Consumer getModel() {
		return consumer;
	}

	// ======================================================================================================
	// LOAD VIEW DETAIL ACCOUNT PROFILE FORM
	@Action("/master/account-profile")
	public String ViewDeatilAccount() {
		getCityList2();
		getCityList();
		loadParentDealCategory();
		return "ViewDetailAccountLoad";
	}

}
